package com.prj.ufdm.core.util;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;


/**
 * 微信 工具
 */
public class UfdmWxUtils {
	
	private static Logger log = LoggerFactory.getLogger(UfdmWxUtils.class);
	
	/**
	 * 获取access_token
	 */
	public static String getAccessToken(String appid,String secret) throws Exception {
		
		String svrUrl ="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appid+"&secret="+secret+"";
		String result = UfdmRequestHttpUtil.postStream(svrUrl, null, "", "utf-8");
		log.info("获取access_token result："+result);
		String access_token = JSON.parseObject(result).getString("access_token");
		log.info("获取access_token："+access_token);
		return access_token;
	}
	
    /**
     * 创建菜单
     * @param accessToken 有效的access_token
     * @throws Exception 
     */
    public static JSONObject createMenu(String accessToken,String data) throws Exception {
        // 拼装创建菜单的url
        String url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token="+accessToken+"";
        // 调用接口创建菜单
        String stream = UfdmRequestHttpUtil.postStream(url, null, data, "utf-8");
        log.info("创建菜单返回结果："+stream);
        JSONObject JSONObject = JSON.parseObject(stream);
        return JSONObject;
    }
    
    /**
     *上传图片素材
     * @param accessToken 有效的access_token
     * @param file    要上传的图片文件
     */
    public static String  uploadImage(String accessToken,File file) throws Exception{  
    	String sendUrl = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token="+accessToken+"&type=image";//ACCESS_TOKEN是获取到的access_token  
        String result = null;  
        result = UfdmWxUtils.send(sendUrl, file); 
        log.info("上传图片素材返回结果："+result);
        JSONObject parseObject = JSON.parseObject(result);
        String pic_media_id = parseObject.getString("media_id");
        return pic_media_id;
    } 
    
   /* *//**
     *上传图文素材
     * @param accessToken 有效的access_token
     * @param file    要上传的图片文件
     *//*
    public static JSONObject uploadNews(String accessToken,WxArticles wxArticles) throws Exception{  
        String url = "https://api.weixin.qq.com/cgi-bin/material/add_news?access_token="+accessToken+"";//ACCESS_TOKEN是获取到的access_token  
        List<WxArticles> articlesList = new ArrayList<>();
        articlesList.add(wxArticles);
        Map<String, Object> map = new HashMap<>();
        map.put("articles", articlesList);
        String jsonStr = JSONObject.fromObject(map).toString();
        String json = UfdmRequestUtil.postStream(url, jsonStr, "utf-8");
        logger.info("上传图文素材返回结果："+json);
        JSONObject jsonObject = JSONObject.fromObject(json);
        return jsonObject;
    }  
    */
    
    /** 
     * 模拟form表单的形式 ，上传文件 以输出流的形式把文件写入到url中，然后用输入流来获取url的响应 
     * @param url 请求地址 form表单url地址 
     * @param filePath 文件在服务器保存路径 
     * @return String url的响应信息返回值 
     */  
    public static String send(String url, File file) throws IOException {  
        String result = null;  
        if (!file.exists() || !file.isFile()) {  
            throw new IOException("文件不存在");  
        }  
        /** 
         * 第一部分 
         */  
        URL urlObj = new URL(url);  
        // 连接  
        HttpURLConnection con = (HttpURLConnection) urlObj.openConnection();  
        /** 
         * 设置关键值 
         */  
        con.setRequestMethod("POST"); // 以Post方式提交表单，默认get方式  
        con.setDoInput(true);  
        con.setDoOutput(true);  
        con.setUseCaches(false); // post方式不能使用缓存  
        // 设置请求头信息  
        con.setRequestProperty("Connection", "Keep-Alive");  
        con.setRequestProperty("Charset", "UTF-8");  
        // 设置边界  
        String BOUNDARY = "---------------------------" + System.currentTimeMillis();  
        con.setRequestProperty("Content-Type", "multipart/form-data; boundary="  
                + BOUNDARY);  
        // 请求正文信息  
        // 第一部分：  
        StringBuilder sb = new StringBuilder();  
        sb.append("--"); // 必须多两道线  
        sb.append(BOUNDARY);  
        sb.append("\r\n");  
        sb.append("Content-Disposition: form-data;name=\"media\";filename=\""  
                + file.getName() + "\"\r\n");  
        sb.append("Content-Type:application/octet-stream\r\n\r\n");  
        byte[] head = sb.toString().getBytes("utf-8");  
        // 获得输出流  
        OutputStream out = new DataOutputStream(con.getOutputStream());  
        // 输出表头  
        out.write(head);  
        // 文件正文部分  
        // 把文件已流文件的方式 推入到url中  
        DataInputStream in = new DataInputStream(new FileInputStream(file));  
        int bytes = 0;  
        byte[] bufferOut = new byte[1024];  
        while ((bytes = in.read(bufferOut)) != -1) {  
            out.write(bufferOut, 0, bytes);  
        }  
        in.close();  
        // 结尾部分  
        byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("utf-8");// 定义最后数据分隔线  
        out.write(foot);  
  
        out.flush();  
        out.close();  
  
        StringBuffer buffer = new StringBuffer();  
        BufferedReader reader = null;  
        try {  
            // 定义BufferedReader输入流来读取URL的响应  
            reader = new BufferedReader(new InputStreamReader(  
                    con.getInputStream()));  
            String line = null;  
            while ((line = reader.readLine()) != null) {  
                buffer.append(line);  
            }  
            if (result == null) {  
                result = buffer.toString();  
            }  
        } catch (IOException e) {  
            System.out.println("发送POST请求出现异常！" + e);  
            e.printStackTrace();  
            throw new IOException("数据读取异常");  
        } finally {  
            if (reader != null) {  
                reader.close();  
            }  
        }  
        return result;  
    }  
    
    
    /**
     * 处理url，拼接url auth2.0权限链接
     * @param accessToken 有效的access_token
     * @throws Exception 
     */
	public static String concatUrlAuth(String url,String wxAppid) throws Exception {
    	String retUrl="https://open.weixin.qq.com/connect/oauth2/authorize?appid="+wxAppid+"&redirect_uri="+url+"&response_type=code&scope=snsapi_base&state=123#wechat_redirect";
    	return retUrl;
    }
    
}
